{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "`ldconfig` 是 Linux 系统用于维护共享库链接和缓存的工具。它会根据配置扫描指定目录，更新 `/etc/ld.so.cache` 文件，以便运行时动态链接器（`ld-linux.so`）能高效找到正确版本的共享库。"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "基本作用\n",
    "\n",
    "1. **扫描共享库目录**：\n",
    "   - 读取 `/etc/ld.so.conf` 和 `/etc/ld.so.conf.d/*.conf` 中列出的路径。\n",
    "   - 默认还会扫描 `/lib`, `/usr/lib`, `/lib64`, `/usr/lib64` 等标准目录。\n",
    "2. **更新缓存文件**：\n",
    "   - 写入 `/etc/ld.so.cache`。\n",
    "   - 提供 `<库名> → <绝对路径>` 的映射，提高动态链接加载速度。\n",
    "3. **创建/更新 SONAME 软链接**：\n",
    "   - 例如 `libm.so` 指向 `libm.so.6`，协助链接器找到合适的库版本。"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "常用命令\n",
    "\n",
    "| 用法                    | 说明                                        |\n",
    "| ----------------------- | ------------------------------------------- |\n",
    "| `ldconfig`              | 按配置文件扫描并更新缓存（需要 root 权限）  |\n",
    "| `ldconfig /path/to/dir` | 仅扫描指定目录并更新（不写入 `ld.so.conf`） |\n",
    "| `ldconfig -p`           | 列出当前缓存的所有库及路径                  |\n",
    "| `ldconfig -v`           | 输出详细信息，常用于调试                    |\n",
    "| `ldconfig -n DIR`       | 只处理指定目录，不读取配置文件              |\n",
    "| `ldconfig -N`           | 不更新缓存（只更新软链接）                  |\n",
    "| `ldconfig -X`           | 不更新软链接（只更新缓存）                  |\n",
    "\n",
    "> 注意：除 `-p` 外，大多数操作都需 root 权限。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "vscode": {
     "languageId": "shellscript"
    }
   },
   "outputs": [],
   "source": [
    "! ldconfig -p"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "配置文件要点\n",
    "\n",
    "- **主配置文件**：`/etc/ld.so.conf`\n",
    "\n",
    "```text\n",
    "include /etc/ld.so.conf.d/*.conf\n",
    "/opt/mylibs\n",
    "```\n",
    "\n",
    "可以直接列目录，也可以用 `include` 引入其他配置文件。\n",
    "\n",
    "- **分目录配置**：`/etc/ld.so.conf.d/*.conf`\n",
    "\n",
    "\n",
    "```text\n",
    "/usr/local/lib\n",
    "/usr/local/lib64\n",
    "```\n",
    "\n",
    "- **自定义库目录**：\n",
    "\n",
    "1. 把库安装到 `/usr/local/lib` 等目录；\n",
    "2. 将目录写入配置文件；\n",
    "3. 执行 `sudo ldconfig`。"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "查看缓存示例"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {
    "vscode": {
     "languageId": "shellscript"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "\tlibssl.so.3 (libc6,x86-64) => /lib/x86_64-linux-gnu/libssl.so.3\n",
      "\tlibssl.so (libc6,x86-64) => /lib/x86_64-linux-gnu/libssl.so\n"
     ]
    }
   ],
   "source": [
    "! ldconfig -p | grep libssl"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "常见场景与建议\n",
    "\n",
    "- **编译安装新库后**：\n",
    "\n",
    "```bash\n",
    "sudo ldconfig\n",
    "```\n",
    "\n",
    "- **只想测试某个目录**：\n",
    "\n",
    "```bash\n",
    "sudo ldconfig -n /usr/local/myapp/lib\n",
    "```\n",
    "\n",
    "- **不修改系统配置，临时使用库**：\n",
    "\n",
    "```bash\n",
    "export LD_LIBRARY_PATH=/opt/myapp/lib:$LD_LIBRARY_PATH\n",
    "```\n",
    "\n",
    "- **慎用大量自定义目录**：\n",
    "过多或权限不当的目录会带来安全隐患。"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "兼容与安全提示\n",
    "\n",
    "- 标准库应保持系统默认目录不变，以免破坏系统运行。\n",
    "- 将自定义库放到版本化目录（如 `/usr/local/lib/mylib-1.2`），再用软链接统一入口。\n",
    "- 在容器或自定义发行版中，可用 `ldconfig -r CHROOT_DIR` 针对指定根目录运行。"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "故障排查\n",
    "\n",
    "1. **程序提示库缺失**：\n",
    "   - 检查库是否安装到正确目录；\n",
    "   - 运行 `ldconfig`;\n",
    "   - 核对 `ldconfig -p` 输出；\n",
    "   - 检查 `LD_LIBRARY_PATH`、`/etc/ld.so.conf`。\n",
    "2. **虚拟环境差异**：\n",
    "   - 在容器、chroot 中需要确保缓存位于对应的根文件系统。"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "C++17",
   "language": "C++17",
   "name": "xcpp17"
  },
  "language_info": {
   "codemirror_mode": "text/x-c++src",
   "file_extension": ".cpp",
   "mimetype": "text/x-c++src",
   "name": "c++",
   "version": "17"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
